package pk.sistema.vendas.web.teste;

import static org.junit.Assert.*;

import java.util.Date;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;

import pk.sistema.vendas.web.HibernateUtil;
import pk.sistema.vendas.web.produto.Produto;

public class ProdutoTeste {

		private static Session sessao;
		private static Transaction transacao;
		
		@BeforeClass
		public static void abreConexao(){
			sessao = HibernateUtil.getSessao().getCurrentSession();
			transacao = sessao.beginTransaction();
		}
		
		@AfterClass
		public static void fecharConexao(){
			//this.transacao.commit();
			
			try {
				transacao.commit();
				/*
				if(this.sessao.isOpen()){
					this.sessao.close();
				}
				*/
			} catch (Throwable e) {
				
			System.out.println("Deu problema no commit!!!!" + e.getMessage());
			
			}finally{
				try {
					if(sessao.isOpen()){
						sessao.close();
					}	
				} catch (Exception e2) {
					System.out.println("Deu erro no fechamento da sessão!!!"+e2.getMessage());
				}
				
			}
		}
		
		@Before
		public void setup(){
			Produto p1 = new Produto("regua", "und", new Date(), 100, 6.50d);
			Produto p2 = new Produto("feijao", "kg", new Date(), 200, 9.50d);
			Produto p3 = new Produto("bola", "und", new Date(), 500, 29.50d);
			Produto p4 = new Produto("cola", "und", new Date(), 800, 9.50d);
			
			sessao.save(p1);
			sessao.save(p2);
			sessao.save(p3);
			sessao.save(p4);
		}
		
		@After
		public void limparBanco(){
			Criteria lista = sessao.createCriteria(Produto.class);
			@SuppressWarnings("unchecked")
			List<Produto> produtos = lista.list();
			
			for (Produto produto : produtos) {
				sessao.delete(produto);
			}
				
		}
		
		@Test
		public void salvarProdutoTeste(){
		
			Query consulta = pesquisar("reg");
			
			Produto produtoPesquisado = (Produto) consulta.uniqueResult();
			
			assertEquals("und", produtoPesquisado.getUnidade());
		/*	
			Produto p1 = new Produto();
			
			p1.setDescricao("arroz");
			p1.setUnidade("kg");
			p1.setDataCadastro(new Date());
			p1.setEstoque(50);
			p1.setValor(2.49d);
			
			//abreConexao();
			this.sessao.save(p1);
			//fecharConexao();
			
			assertNull(null);
		*/
		}
		
		@Test
		public void listarProdutosTeste(){
			Criteria lista = sessao.createCriteria(Produto.class);
			@SuppressWarnings("unchecked")
			List<Produto> produtos = lista.list();
			
			assertEquals(4, produtos.size());
		}
		
		@Test
		public void excluirProdutoTeste(){
			Query consulta = pesquisar("feijao");
			
			Produto produtoDeletado = (Produto) consulta.uniqueResult();
			sessao.delete(produtoDeletado);
			
			produtoDeletado = (Produto) consulta.uniqueResult();
			assertNull(produtoDeletado);
		}
		
		@Test
		public void alterarProdutoTeste(){
			Query consulta = pesquisar("bola");
			Produto produtoAlterado = (Produto) consulta.uniqueResult();
			produtoAlterado.setEstoque(600);
			
			sessao.update(produtoAlterado);
			produtoAlterado = (Produto) consulta.uniqueResult();
			
			assertEquals(600, produtoAlterado.getEstoque().intValue());
				
		}

		private Query pesquisar(String pesquisa) {
			String sql = "from Produto p where p.descricao like :descricao";
			Query consulta = sessao.createQuery(sql);
			consulta.setString("descricao", "%"+pesquisa+"%");
			return consulta;
		}

}
